dofile "lib/radical.lua"

function tile(s) 
  return const.path.gfx.."game/ka/"..s..".jpg"; 
end

function cm_tile(s) 
  return const.path.gfx.."game/common/"..s..".jpg"; 
end

function dxml(s)
  return const.path.dlg.."3-inter/work/"..s..".xml";
end

main = engine.main {
   start        = chain_ {
                     episode_("3-work")
                    ,musplayer_("work_player")
                    ,walk_("hall")
                  }
  ,finish       = gamefile_("3-inter/inter.lua")
}

work = engine.state {
   _call        = 0     --Kate calling to different numbers (1,2,3,4)
  ,_bin         = 0     --Kate is investigating bin
  ,_pencil      = false --Kate took pencil
  ,_paper       = false --Kate found peace of paper
  ,_papertable  = false --Kate put a paper on a table
  ,_draw        = false --Kate used pencil on paper
  ,_place       = false --Kate find construction company
}

work_const = {
  defx = 380,
  defy = 170,
  w = 55,
  h = 55,
  space = 15,
  indicy = 100
}

work_player = musplayer.player {
   sfx("not"):inside("call_bad"):always()
  ,sfx("phone_out"):inside("call_nobody"):always()
  ,sfx("phone_out"):inside("call_todialog"):always()
  ,sfx("phonebusy"):inside("call_busy"):always()
  ,sfx("phone_wrong"):inside("call_wrong"):always()
  ,sfx("phone_hang"):inside("call_hang"):always()
  ,mus("perversion"):inside("kateroom")
  ,mus("satiate_strings"):inside("kateroom2")
}

function bookscene(o)
  return scene {
     bounds     = { 250, 120, 440 }
    ,dsc        = o.dsc
    ,alwaysdsc  = true
    ,goleft     = o.left
    ,goright    = o.right
    ,ondrawbg   = function(s,p)
                    local bc = "#333333";
                    drawing.draw_mask(p, 230, 60, 480, 1, bc, 255);
                    drawing.draw_mask(p, 230, 60, 1, 500, bc, 255);
                    drawing.draw_mask(p, 710, 60, 1, 500, bc, 255);
                    drawing.draw_mask(p, 230, 560, 480, 1, bc, 255);
                    
                    drawing.draw_text(p, o.title, 250, 80, const.textcolor, const.fontb, 16);
                    
                    if s.arr_map == nil then
                      s.arr_map = map(0, 0, const.picwidth, const.picheight);
                    end
                    local lx,ly, rx,ry = 200,260, 730,260;
                    
                    if s.goleft ~= nil then
                      s.arr_map:add("left", lx, ly, 9, 18);
                      drawing.draw_pic(p, const.path.ui.."left.png", lx, ly, true);
                    end
                    
                    if s.goright ~= nil then
                      s.arr_map:add("right", rx, ry, 9, 18);
                      drawing.draw_pic(p, const.path.ui.."right.png", rx, ry, true);
                    end
                    
                    return p;
                  end
    ,ontimer    = function(s,x,y)
                    local sel = s.arr_map:get(x, y);
                    if s.oldarr ~= nil and sel ~= s.oldarr.sel then
                      drawing.clean(s.pic, s.oldarr.x, s.oldarr.y, 9, 18);
                      s.oldarr = nil;
                    end
                    if sel ~= nil then
                      local it = s.arr_map.items_[sel];
                      local tx,ty = it[1],it[2]-20;
                      drawing.copy_pic(s.pic, const.path.ui..sel.."_sel.png", tx, ty, true);
                      s.oldarr = { sel = sel, x = tx, y = ty };
                    end
                  end
    ,onclick    = function(s,x,y)
                    local sel = s.arr_map:get(x, y);
                    if sel ~= nil then
                      play_sound("page");
                      walk(s["go"..sel]);
                    end
                  end
    ,nav        = o.nav
  }
end

hall = scene {
   tile         = tile "hall"
  ,bounds       = { 200, nil, 640 }
  ,dsc          = [[Квартира без отца казалась такой мертвой и пустой. 
                    ^Катя от усталости едва стояла на ногах, однако ей не давали покоя мысли о последнем месте работы отца. 
                    Быть может, это и правда поможет разобраться в том, что же с ним произошло?^^]]
  ,obj          = { "books", "dadbag", "shelf", "bin" }
  ,nav          = {
                     right = vw("На кухню", "kitchen")
                    ,left = vw("В комнату Кати", "kateroom")
                    ,down = vw("В прихожую", "coridor")
                  }
}

books = staticitem {
   dsc          = "На полках стоят {отцовские книги}."
  ,act          = "Это просто любимые детективы отца."
  ,showonce     = true
}

shelf = staticitem {
   dsc          = "Вещи в {шкафу} у окна вызывают болезненные воспоминания."
  ,act          = "Катя все здесь уже осмотрела, но ничего не смогла найти -- ни писем, ни чеков, ни телефонных номеров -- ничего такого, что помогло бы понять, где подрабатывал ее отец."
  ,showonce     = true
}

dadbag = staticitem {
   dsc          = "У дивана стоит старый {портфель} отца, с которым тот ходил на работу."
  ,act          = [[В портфеле лежит трудовая книжка, но по ней отца уволили с последней работы еще полгода назад. Однако он точно
                    подрабатывал где-то до того, как начались приступы.]]
  ,showonce     = true
}

bin = staticitem {
   dsc          = "В {мусорном ведре} еще лежат осколки чашки, которую отец разбил недавней ночью."
  ,act          = walk_("bin_scene")
  ,disable      = if_("work._paper")
}

bin_scene = scene {
   bounds       = { 260, 220, 480 }
  ,obj          = { "bin_search" }
  ,nav          = {
                    down = vw("Отойти", "hall")
                  }
}

bin_search = matroska {
   { dsc = "Мусорное ведро давно не убирали, и от него уже начинает исходить неприятный запах. Катя и сама не понимает, что она хочет здесь {найти}.", act = chain_ { sound_("items"), exec_("work._bin=1"), refresh } }
  ,{ dsc = "Здесь тоже ничего нет -- использованные пакетики с чаем, пустые банки, даже осколки от чашки. Катя чуть не поранила руку о них. Вряд ли в мусорном ведре можно {найти} что-нибудь полезное.", act = chain_ { sound_("items"), exec_("work._bin=2"), refresh }  }
  ,{ dsc = "Катя вытряхнула содержимое всего ведра на пол. Среди мусора она нашла какой-то мятый {обрывок бумаги}.",act = chain_ { sound_("items"), exec_("work._bin=3"), refresh }  }
  ,{ dsc = "Это просто чистый лист бумаги. Хотя, если приглядеться, то можно заметить на нем какие-то слабые следы -- как будто бумага слегка продавилась от нажима ручкой. Быть может, это лист из какого-нибудь блокнота, и на нем остался {след от записи} на предыдущей странице?", act = chain_ { exec_("work._bin=4"), refresh }  }
  ,{ dsc = "Нет, так ничего прочитать не получится. Но лучше {взять} этот лист с собой.", act = chain_ { take_("paper"), exec_("work._bin=0"), set_("work._paper"), walk_("hall") } }
  ,{ dsc = "Здесь больше нет ничего интересного." }
}

paper = item {
   nam          = "Листок бумаги"
  ,ico          = ico "paper"
  ,img          = ico "paper-use"
  ,activate     = function(s)
                    if work._draw then
                      here().tmpdsc = "На листке можно прочитать какие-то цифры: 223-403. Почерк отцовский. Это похоже на номер телефона, однако последней цифры не хватает. К тому же отец почему-то не записал код округа.";
                    else
                      here().tmpdsc = "Нет, так прочитать ничего не получится.";
                    end
                    inventory.clearitem();
                    refresh();
                  end
}

kitchen = scene {
   tile         = tile "table"
  ,dsc          = "Кате совсем не хочется есть. Даже сама мысль о еде вызывает у нее тошноту."
  ,alwaysdsc    = true
  ,nav          = {
                    down = vw("В гостиную", "hall")
                  }
}

coridor = scene {
   tile         = { cm_tile "coridor", 500, 20 }
  ,bounds       = { nil, 50, 500 }
  ,obj          = { "phonebook", "dadbox" }
  ,nav          = {
                     up = vw("Выйти из квартиры"):cnd("false", "Кате совсем не хочется куда-то идти.")
                    ,left = vw("В туалет", "toilet")
                    ,down = vw("В гостиную", "hall")
                  }
}

phonebook = staticitem {
   dsc          = "На тумбочке у стены лежит {телефонная книга}, которую недавно достала Катя."
  ,act          = "{phonebook_open|Здесь} есть телефоны муниципальных и коммерческих служб, а также кода городских округов."
}

phonebook_open = staticitem {
  act           = walk_("phonebook_scene1")
}

phonebook_scene1 = bookscene {
   title        = "Информационные службы"
  ,dsc          = [[00-411 -- Общее справочное бюро^
                    00-100 -- Текущее время^
                    00-999 -- Справочная городской телефонной сети^
                    00-777 -- Справочная федеральной телефонной сети^
                    00-657 -- Справочная единой транспортной службы
                  ]]
  ,right        = "phonebook_scene2"
  ,nav          = { down = vw("Отложить книгу", "coridor") }
}

phonebook_scene2 = bookscene {
   title        = "Телефоны экстренной связи"
  ,dsc          = [[00-112 -- Полиция^
                    00-113 -- Группа реагирования^
                    00-114 -- Патруль^
                    00-212 -- Скорая помощь^
                    00-312 -- Пожарная служба^
                    00-412 -- Радиационный контроль^
                    00-512 -- Центр контроля заболеваний
                  ]]
  ,left         = "phonebook_scene1"
  ,right        = "phonebook_scene3"
  ,nav          = { down = vw("Отложить книгу", "coridor") }
}

phonebook_scene3 = bookscene {
   title        = "Телефонные коды округов"
  ,dsc          = [[10 -- Новомыский округ^
                    11 -- Весельский округ^
                    12 -- Новоземельский округ^
                    13 -- Спасский округ^
                    14 -- Октябрьский округ^
                    15 -- Речной округ^
                    20 -- Северный округ^
                    25 -- Северо-Западный округ^
                    27 -- Северо-Восточный округ^
                    30 -- Восточный округ^
                    40 -- Южный округ^
                    45 -- Юго-Восточный округ^
                    47 -- Юго-Западный округ^
                    50 -- Западный округ^
                    60 -- Центральный округ
                  ]]
  ,left         = "phonebook_scene2"
  ,nav          = { down = vw("Отложить книгу", "coridor") }
}

dadbox = staticitem {
   dsc          = "На столе -- {коробка} с инструментами отца."
  ,act          = [[Здесь лежат слесарные инструменты отца и новый дверной замок, весь в масле. Еще до того, как начались все эти 
                    приступы, отец хотел заменить замок на входной двери, который порядочно расшатался. Кате тяжело вспоминать об этом.]]
  ,showonce     = true
}

toilet = scene {
   tile         = cm_tile "toilet"
  ,bounds       = { 50, nil, 750 }
  ,dsc          = "Здесь нет ничего интересного."
  ,alwaysdsc    = true
  ,nav          = {
                    down = vw("Выйти", "coridor")
                  }
}

kateroom_hub = engine.hub {
  enter         = choose_ {
                     ["default"] = walk_("kateroom")
                    ,["work._place"] = walk_("kateroom2")
                  }
}

kateroom = scene {
   tile         = tile "bed"
  ,dsc          = [[В комнате Кати стоит спертый воздух, пропитанный пылью -- так, что даже тяжело дышать, -- хотя на улице бушует ливень.^
                    Здесь ничего не менялось уже несколько дней.]]
  ,alwaysdsc    = true
  ,obj          = { "tablepencil", "phone" }
  ,nav          = {
                    down = vw("Выйти из комнаты", "hall")
                  }
}

kateroom2 = scene {
   tile         = tile "bed"
  ,dsc          = [[Белстрой... Катя уже где-то слышала это название раньше. Возможно, отец и правда подрабатывал в этой компании? У нее есть адрес --
                    улица Соловьева, тридцать три. Катя даже машинально записала его на листке бумаги, чтобы не забыть. Она и сама не понимала,
                    что ожидает там найти, но оставаться дома, среди всех этих вещей и духоты, у нее просто не было сил.^^
                    Катя посмотрела в окно. Дождь лил не переставая.]]
  ,nav          = {
                    down = vw("Выйти из комнаты", "main")
                  }
}

tablepencil = staticitem {
   dsc          = choose_ {
                     ["default"] = 
                        [[Старые книги, которыми Катя прижимала створку окна, покоробившиеся от влаги, с расползающимися коленкорами, все также лежат на подоконнике. 
                          За стол Катя не садилась уже несколько дней, она даже не передвигала стул, не трогала исписанные тетради, сложенные стопкой под перегоревшей 
                          лампой, не брала в руки исписанный {карандаш}, которым обычно делала конспекты, когда готовилась к экзаменам.^ ]]
                    ,["tablepencil._seen"] =
                        [[Даже старые книги, которыми Катя прижимала створку окна, покоробившиеся от влаги, с расползающимися коленкорами, все также лежат на подоконнике.^]]
                  }
  ,act          = chain_ { take_("pencil"), "Катя взяла карандаш." }
}

pencil = item {
   nam          = "Карандаш"
  ,ico          = ico "pencil"
  ,img          = ico "pencil-use"
  ,use          = chooseuse_ {
                     ["default"] = "В этом нет никакого смысла."
                    ,["paper"] = chain_ { set_("work._draw"), sound_("pencil"), "Кажется, это помогло. На листке что-то появилось. Можно попробовать прочитать." }
                  }
}

phone = staticitem {
   dsc          = [[Здесь ничего не изменилось с тех пор, как умер отец. Вся комната, все эти незначительные старые вещи, канцелярские приборы, испорченные
                    книги, даже неубранная пыль на полках и прошлогодний отрывной календарь будто бы оказались здесь по ошибке, перенеслись в эту комнату
                    из другого времени, когда отец был еще жив, когда она сама собирала адреса поликлиник и обзванивали врачей, когда она еще надеялась, что 
                    этот ночной кошмар скоро закончится, и жизнь их станет такой же как прежде. А теперь даже кнопочный {телефон}, который несколько лет назад
                    отец принес с работы, вызывает у нее мучительные воспоминания.]]
  ,act          = walk_("phone_scene")
}

function phoneroom(o)
  return navigation.room(engine.gameroom(o));
end

function png(s)
  return const.path.gfx.."game/common/"..s..".png";
end

phone_scene = phoneroom {
   fps          = 20
  ,drawbutton   = function(s,p,n,x,y,sel)
                    local bg = const.textcolor;
                    if sel then
                      bg = "white";
                    end
                    local fc = "black";
                    local txt = tostring(n);
                    drawing.copy_mask(p, x, y, work_const.w, work_const.h, bg, 255);
                    
                    if n == 10 then
                      txt = "0";
                    elseif n == 11 then
                      txt = "C";
                    elseif n == 12 then
                      drawing.copy_pic(p, png("tube"), x+6,y+2);
                      return nil;
                    end
                    
                    drawing.copy_text(p, txt, x+18, y+10, fc, const.fontb, 32);
                  end
  ,enter        = function(s)
                    s._dialed = nil;
                  end
  ,selected     = function(s,x,y)
                    s:build();
                    return s.keyboard:get(x,y);
                  end
  ,dial         = function(s,n)
                    if s._dialed == nil then
                      s._dialed = "";
                    end
                    if n == 10 then
                      n = 0;
                    end
                    if s.sounds[n] ~= nil then
                      play_sound(s.sounds[n]);
                    end
                    s._dialed = s._dialed..tostring(n);
                  end
  ,mapping      = {
                    [1] = "one",
                    [2] = "two",
                    [3] = "three",
                    [4] = "four",
                    [5] = "five",
                    [6] = "six",
                    [7] = "seven",
                    [8] = "eight",
                    [9] = "nine",
                    [10] = "zero",
                    [0] = "zero",
                    [11] = "digit"
                  }
  ,sounds       = {
                    [1] = "tone1",
                    [2] = "tone2",
                    [3] = "tone3",
                    [4] = "tone4",
                    [5] = "tone5",
                    [6] = "tone6",
                    [7] = "tone7",
                    [8] = "tone2",
                    [9] = "tone5",
                    [10] = "tone1",
                    [0] = "tone1",
                  }
  ,ondraw       = function(s,p)
                    s:drawdialed(p);
                  end
  ,drawdialed   = function(s,p)
                    drawing.clean(p, work_const.defx, work_const.indicy, 200, 250);
                    
                    if s._dialed == nil then
                      s._dialed = "";
                    end
                    
                    local x = work_const.defx;
                    local st = 20;
                    local count = 0;
                    local pho = 0;
                    local len = string.len(s._dialed);
                    while count < 10 do
                      count = count + 1;
                      pho = pho + 1;
                      local cv = s._dialed:charat(count);
                      if cv == nil then
                        cv = 11;
                      end
                      local v = tonumber(cv);
                      if v ~= 11 or pho < 11 then
                        drawing.copy_pic(p, png(s.mapping[v]), x, work_const.indicy);
                      end
                      x = x + st;
                      if count == 2 and len > 2 then
                        pho = pho + 1;
                        drawing.copy_pic(p, png("dash"), x, work_const.indicy);
                        x = x + st;
                      end
                    end
                  end
  ,onclick     = function(s,x,y)
                    local sel = s:selected(x, y-const.blackbar);
                    if sel ~= nil then
                      if sel < 11 and (s._dialed == nil or string.len(s._dialed) < 9) then
                        s:dial(sel);
                        s:drawdialed(s.pic);
                      elseif sel == 11 then
                        s._dialed = nil;
                        s:drawdialed(s.pic);
                      elseif sel == 12 and s._dialed ~= nil and string.len(s._dialed) >= 5 then
                        if s.route[s._dialed] == nil then
                          if string.len(s._dialed) == 9 then
                            walk("call_nobody");
                          else
                            walk("call_wrong");
                          end
                        else
                          walk(rcall(s.route[s._dialed]));
                        end
                      end
                    end
                  end
  ,build        = function(s)
                    if s.keyboard == nil then
                      local n = 0;
                      local x = work_const.defx;
                      local y = work_const.defy;
                      s.keyboard = map(x, y, work_const.w*3 + work_const.space*2, work_const.h*4 + work_const.space*3);
                      while true do
                        n = n + 1;
                        s.keyboard:add(n,x-work_const.defx,y-work_const.defy, work_const.w, work_const.h);
                        x = x + work_const.w + work_const.space;
                        if n % 3 == 0 then
                          x = work_const.defx;
                          y = y + work_const.h + work_const.space;
                        end
                        if n == 12 then
                          return nil;
                        end
                      end
                    end
                  end
  ,ontimer      = function(s,x,y)
                    local sel = s:selected(x,y-const.blackbar);
                    if sel ~= s.sel then
                      if s.oldsel ~= nil then
                        drawing.clean(s.pic, s.oldsel.x, s.oldsel.y-20, work_const.w, work_const.h);
                      end
                      s.oldsel = nil;
                      if sel ~= nil then
                        local si = s.keyboard.items_[sel];
                        s:drawbutton(s.pic,sel,si[1]+work_const.defx,si[2]+work_const.defy-20,true);
                        s.oldsel = {x=si[1]+work_const.defx,y=si[2]+work_const.defy};
                      end
                      s.sel = sel;
                    end
                  end
  ,ondrawbg     = function(s,p)
                    local n = 0;
                    local x = work_const.defx;
                    local y = work_const.defy;
                    while true do
                      n = n + 1;
                      s:drawbutton(p,n,x,y,false);
                      x = x + work_const.w + work_const.space;
                      if n % 3 == 0 then
                        x = work_const.defx;
                        y = y + work_const.h + work_const.space;
                      end
                      if n == 12 then
                        return p;
                      end
                    end
                    
                    return p;
                  end
  ,route        = {
                     ["00112"] = "call_bad"
                    ,["00113"] = "call_bad"
                    ,["00114"] = "call_bad"
                    ,["00212"] = "call_bad"
                    ,["00312"] = "call_bad"
                    ,["00412"] = "call_bad"
                    ,["00512"] = "call_bad"
                    
                    ,["00411"] = "call_busy"
                    ,["00100"] = "call_busy"
                    ,["00999"] = "call_busy"
                    ,["00657"] = "call_busy"
                    ,["00777"] = "call_busy"
                    
                    ,["252234032"] = chain_ { exec_("work._call=1;"), "call_todialog" }
                    ,["252234034"] = "call_busy"
                    ,["252234037"] = chain_ { exec_("work._call=2;"), "call_todialog" }
                    ,["252234035"] = chain_ { exec_("work._call=3;"), "call_todialog" }
                    ,["252234038"] = "call_busy"
                    ,["252234039"] = chain_ { exec_("work._call=4;"), "call_todialog" }
                    
                  }
  ,nav          = {
                    down = vw("Оставить телефон", "kateroom_hub")
                  }
}

function phone_feedback(txt)
  return cutscene {
     ondrawbg   = function(s,p)
                    local endx = drawing.draw_text_center(p, txt, const.picwidth, 240, const.textcolor, const.font, 14)
                    drawing.draw_pic(p, const.path.ui.."next.png", endx+5, 240);
                    return p;
                  end
    ,next       = "phone_scene"
  }
end

function phone_dial(next)
  return pause {
     time       = 2000
    ,next       = next
  }
end

call_bad = phone_feedback("Лучше не звонить сейчас по этому номеру.")

call_nobody = phone_dial("call_nobody1")

call_nobody1 = phone_feedback("Никто не берет трубку.");

call_wrong = phone_dial("call_wrong1")

call_wrong1 = phone_feedback("Неправильно набран номер.");

call_busy = phone_dial("call_busy1");

call_busy1 = phone_feedback("Занято.");

call_todialog = phone_dial("call_dialog");

call_hang = phone_dial("phone_scene");

call_dialog = dialog {
   bounds     = { 260, 200, 480 }
  ,dsc          = choose_ {
                     ["work._call==1"] = "-- Да? Кто это?"
                    ,["work._call==2"] = "-- Женечка? Это ты?"
                    ,["work._call==3"] = "-- Да, слушаю."
                    ,["work._call==4"] = "-- Белстрой. Слушаю."
                  }
  ,dlg          = dxml "phone"
}